package reports

import (
	"encoding/json"
	"io/ioutil"
	"sync"

	"shqsoft.cn/pasnj/base"
)

//Config 报表配置
type Config struct {
	Type         string            `json:"type"`
	Name         string            `json:"name"`
	KeyColumn    string            `json:"keyColumn"`
	UserIDColumn string            `json:"userIDColumn"`
	OrderBy      string            `json:"orderBy"`
	GroupColumns []string          `json:"groupColumns"`
	Where        string            `json:"where"`
	Columns      []Column          `json:"columns"`
	Params       []Parameter       `json:"params"`
	DataSource   DataSource        `json:"dataSource"`
	DataSQL      map[string]string `json:"dataSql"`
}

//Column 列定义
type Column struct {
	Title     string   `json:"title"`
	Name      string   `json:"name"`
	DataIndex string   `json:"dataIndex"`
	Width     int      `json:"width"`
	DataType  string   `json:"dataType"`
	Format    string   `json:"format"`
	Sorter    bool     `json:"sorter"`
	Dispaly   bool     `json:"dispaly"`
	Filter    bool     `json:"filter"`
	Children  []Column `json:"children"`
	GroupCalc string   `json:"groupCalc"`
}

//Parameter 报表参数
type Parameter struct {
	Name         string     `json:"name"`
	Caption      string     `json:"caption"`
	DataType     string     `json:"dataType"`
	InitVal      string     `json:"initVal"`
	EditType     string     `json:"editType"`
	Fetch        Fetch      `json:"fetch"`
	DataItems    []DataItem `json:"data"`
	Placeholder  string     `json:"placeholder"`
	RelationSign string     `json:"relationSign"`
	HasAll       bool       `json:"hasAll"`
	Layout       Layout     `json:"layout"`
}

//Fetch 查找数据项
type Fetch struct {
	TableName     string   `json:"tableName"`
	SearchColumns []string `json:"searchColumns"`
	OptionTpl     string   `json:"optionTpl"`
	ValueTpl      string   `json:"valueTpl"`
	Where         string   `json:"where"`
}

//DataItem 数据项
type DataItem struct {
	Value string `json:"value"`
	Label string `json:"label"`
}

//Layout 查询参数的页面布局
type Layout struct {
	Grid        int `json:"grid"`
	LabelSpan   int `json:"labelSpan"`
	WrapperSpan int `json:"wrapperSpan"`
}

//DataSource 数据源
type DataSource struct {
	Type       string    `json:"type"`
	Name       string    `json:"name"`
	BeforeCall *CallBack `beforeCall:"name"`
	AfterCall  *CallBack `beforeCall:"afterCall"`
}

//CallBack 回调
type CallBack struct {
	Type string `json:"type"`
	Name string `json:"name"`
}

var confMap sync.Map

func loadConfig(name string) (conf *Config, err error) {
	path, err := base.ExecPath()
	if err != nil {
		return
	}
	path = path + "/reportConfig/" + name + ".json"
	jsonBytes, err := ioutil.ReadFile(path)
	if err != nil {
		return
	}
	conf = &Config{}
	err = json.Unmarshal(jsonBytes, conf)
	if err != nil {
		confMap.Store(name, conf)
	}
	return
}

//GetReportConfig 获取报表配置
func GetReportConfig(name string) (conf *Config, err error) {
	if obj, ok := confMap.Load(name); ok {
		conf, _ := obj.(*Config)
		return conf, nil
	}
	return loadConfig(name)
}
